﻿using SIAKADCORE.Helpers;
using SIAKADCORE.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIAKADCORE.Controllers
{
    /// <summary>
    /// Kelas PegawaiController
    /// </summary>
    public static class PegawaiController
    {
        /// <summary>
        /// Method untuk menambahkan entri pegawai.
        /// </summary>
        /// <param name="pegawai">Kelas Pegawai.</param>
        /// <returns>True ketika sukses menambahkan entri dan sebaliknya.</returns>
        public static bool Tambah(Pegawai pegawai)
        {
            string queryString = string.Format("INSERT INTO {0} ({1} ,{2} ,{3}) VALUES ('{4}' ,'{5}' ,'{6}')",
                Pegawai.TableName, Pegawai.ColumnNameIdPegawai, Pegawai.ColumnNameNamaPegawai, Pegawai.ColumnNameNip,
                pegawai.IdPegawai, pegawai.NamaPegawai, pegawai.Nip);
            bool isSuccess = SQLHelper.Instance.ExecuteNonQuery(queryString);

            var log = new Log
            {
                IdLog = "LogController.GetID()",
                IsiLog = PegawaiController.TambahLogMessage(pegawai)
            };

            bool logSuccess = LogController.Tambah(log);

            return (isSuccess && logSuccess);
        }

        public static string TambahLogMessage(Pegawai pegawai)
        {
            return string.Format("{0}: Ditambahkan pegawai baru dengan rincian: [{1}].", DateTime.Now, pegawai.ToString());
        }


        /// <summary>
        /// Method untuk mengubah entri pegawai.
        /// </summary>
        /// <param name="idPegawai">Id pegawai yang akan diubah.</param>
        /// <param name="pegawai">Kelas Pegawai.</param>
        /// <returns>True ketika sukses mengubah entri dan sebaliknya.</returns>
        public static bool Ubah(string idPegawai, Pegawai pegawai)
        {
            string queryString = string.Format("UPDATE {0} SET {1} = '{2}' ,{3} = '{4}' ,{5} = '{6}' WHERE {1} = '{7}'",
                Pegawai.TableName, Pegawai.ColumnNameIdPegawai, pegawai.IdPegawai,
                Pegawai.ColumnNameNamaPegawai, pegawai.NamaPegawai,
                Pegawai.ColumnNameNip, pegawai.Nip, idPegawai);
            bool isSuccess = SQLHelper.Instance.ExecuteNonQuery(queryString);

            var log = new Log
            {
                IdLog = "LogController.GetID()",
                IsiLog = PegawaiController.UbahLogMessage(idPegawai, pegawai)
            };

            bool logSuccess = LogController.Tambah(log);

            return (isSuccess && logSuccess);
        }

        public static string UbahLogMessage(string idPegawai, Pegawai pegawai)
        {
            return string.Format("{0}: Pegawai ber-id [{1}] telah diubah dengan rincian: [{2}].",
                DateTime.Now, idPegawai, pegawai.ToString());
        }

        /// <summary>
        /// Method untuk menghapus entri pegawai.
        /// </summary>
        /// <param name="idPegawai">Id pegawai yang akan dihapus.</param>
        /// <returns>True ketika sukses menghapus entri dan sebaliknya.</returns>
        public static bool Hapus(string idPegawai)
        {
            string queryString = string.Format("DELETE FROM {0} WHERE {1} = '{2}'",
                Pegawai.TableName, Pegawai.ColumnNameIdPegawai, idPegawai);
            bool isSuccess = SQLHelper.Instance.ExecuteNonQuery(queryString);

            var log = new Log
            {
                IdLog = "LogController.GetID()",
                IsiLog = PegawaiController.HapusLogMessage(idPegawai)
            };

            bool logSuccess = LogController.Tambah(log);

            return (isSuccess && logSuccess);
        }

        public static string HapusLogMessage(string idPegawai)
        {
            return string.Format("{0}: Pegawai ber-id [{1}] telah dihapus.", DateTime.Now, idPegawai);
        }

        /// <summary>
        /// Method untuk mendapatkan hasil query dari tabel pegawai.
        /// </summary>
        /// <param name="dataset">Dataset keluaran yang berisi hasil query.</param>
        /// <returns>True ketika sukses meng-query dan sebaliknya.</returns>
        public static bool GetTabel(out DataSet dataset)
        {
            string queryString = string.Format("SELECT {0} ,{1} ,{2} FROM {3}",
                Pegawai.ColumnNameIdPegawai, Pegawai.ColumnNameNamaPegawai,
                Pegawai.ColumnNameNip, Pegawai.TableName);
            return SQLHelper.Instance.ExecuteReader(queryString, out dataset);
        }

        /// <summary>
        /// Method utnuk mendapatkan hasil query dari tabel pegawai.
        /// </summary>
        /// <param name="dataset">Dataset keluaran yang berisi hasil query.</param>
        /// <param name="customQueryString">Kustomisasi query.</param>
        /// <returns>True ketika sukses meng-query dan sebaliknya.</returns>
        public static bool GetTabel(out DataSet dataset, string customQueryString)
        {
            return SQLHelper.Instance.ExecuteReader(customQueryString, out dataset);
        }

        /// <summary>
        /// Method untuk mendapatkan id pegawai. Digunakan pada saat memasukkan entri baru.
        /// </summary>
        /// <returns>string kosong ketika terjadi error atau id pegawai baru.</returns>
        public static string GetID()
        {
            var dataset = new DataSet();
            bool isQueryAccomplished = GetTabel(out dataset);
            if (!isQueryAccomplished) return string.Empty;

            return SQLHelper.Instance.GetID(Pegawai.IdPrefix, Pegawai.IdLength, ref dataset);
        }
    }
}
